home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2.sit
/
Raven 1.2
/
Source
/
Foundation
/
OS
/
ZRegion.cpp
< prev
next >
Wrap
Text File
|
1997-02-01
|
11KB
|
634 lines
/*
* File: ZRegion.h
* Summary: RgnHandle wrapper.
* Written by: Jesse Jones
*
* Copyright ゥ 1996 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <-> 1/28/96 JDJ Created
*/
#include <ZRegion.h>
#include <ZDebug.h>
#include <ZExceptions.h>
#include <ZQueue.h>
// ===================================================================================
// class ZRegionPool
// ===================================================================================
class ZRegionPool {
protected:
~ZRegionPool();
ZRegionPool();
public:
static ZRegionPool* Instance();
RgnHandle AcquireRegion();
void ReleaseRegion(RgnHandle rgn);
protected:
TQueue<RgnHandle> mRegions;
};
//---------------------------------------------------------------
//
// ZRegionPool::~ZRegionPool
//
//---------------------------------------------------------------
ZRegionPool::~ZRegionPool()
{
while (!mRegions.empty()) {
RgnHandle rgn = mRegions.back();
mRegions.pop_back();
DisposeRgn(rgn);
}
}
//---------------------------------------------------------------
//
// ZRegionPool::ZRegionPool
//
//---------------------------------------------------------------
ZRegionPool::ZRegionPool()
{
}
//---------------------------------------------------------------
//
// ZRegionPool::Instance [static]
//
//---------------------------------------------------------------
ZRegionPool* ZRegionPool::Instance()
{
static ZRegionPool pool;
return &pool;
}
//---------------------------------------------------------------
//
// ZRegionPool::AcquireRegion
//
//---------------------------------------------------------------
RgnHandle ZRegionPool::AcquireRegion()
{
RgnHandle rgn = nil;
if (!mRegions.empty()) {
rgn = mRegions.back();
mRegions.pop_back();
} else {
rgn = NewRgn();
ThrowIfNil(rgn);
}
return rgn;
}
//---------------------------------------------------------------
//
// ZRegionPool::ReleaseRegion
//
//---------------------------------------------------------------
void ZRegionPool::ReleaseRegion(RgnHandle rgn)
{
ASSERT(rgn != nil);
SetEmptyRgn(rgn);
mRegions.push_back(rgn);
}
#pragma mark -
// ===================================================================================
// class TRegion
// ===================================================================================
//---------------------------------------------------------------
//
// Destructor
//
//---------------------------------------------------------------
TRegion::~TRegion()
{
if (mRgn != nil)
ZRegionPool::Instance()->ReleaseRegion(mRgn);
}
//---------------------------------------------------------------
//
// Constructors
//
//---------------------------------------------------------------
TRegion::TRegion()
{
mRgn = ZRegionPool::Instance()->AcquireRegion();
}
TRegion::TRegion(const TRegion& rgn)
{
mRgn = ZRegionPool::Instance()->AcquireRegion();
CopyRgn(rgn, mRgn);
ThrowIfQDError();
}
TRegion::TRegion(RgnHandle rgn)
{
ASSERT(rgn != nil);
mRgn = ZRegionPool::Instance()->AcquireRegion();
CopyRgn(rgn, mRgn);
ThrowIfQDError();
}
TRegion::TRegion(const TRect& rect)
{
mRgn = ZRegionPool::Instance()->AcquireRegion();
RectRgn(mRgn, rect);
ThrowIfQDError();
}
TRegion::TRegion(const TPoint& pt, const TSize& size)
{
mRgn = ZRegionPool::Instance()->AcquireRegion();
RectRgn(mRgn, TRect(pt, size));
ThrowIfQDError();
}
TRegion::TRegion(const TPoint* vertices, short count)
{
ASSERT(vertices != nil);
ASSERT(count > 0);
mRgn = ZRegionPool::Instance()->AcquireRegion();
OpenRgn();
::MoveTo(vertices[0].h, vertices[0].v);
for (short index = 1; index < count; index++) {
LineTo(vertices[index].h, vertices[index].v);
}
LineTo(vertices[0].h, vertices[0].v);
CloseRgn(mRgn);
ThrowIfQDError();
}
//---------------------------------------------------------------
//
// Assignment
//
//---------------------------------------------------------------
TRegion& TRegion::operator=(const TRegion& rgn)
{
if (this != &rgn && *this != rgn) {
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
CopyRgn(rgn, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
}
return *this;
}
TRegion& TRegion::operator=(const TRect& rect)
{
if (*this != rect) {
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
}
return *this;
}
TRegion& TRegion::operator+=(const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
UnionRgn(mRgn, rgn, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator+=(const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
UnionRgn(mRgn, temp, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator+=(const TPoint& offset)
{
TRect src, dst;
src = dst = (**mRgn).rgnBBox;
dst += offset;
::MapRgn(mRgn, src, dst);
return *this;
}
TRegion& TRegion::operator-=(const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
DiffRgn(mRgn, rgn, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator-=(const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
DiffRgn(mRgn, temp, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator-=(const TPoint& offset)
{
TRect src, dst;
src = dst = (**mRgn).rgnBBox;
dst -= offset;
::MapRgn(mRgn, src, dst);
return *this;
}
TRegion& TRegion::operator&=(const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
SectRgn(mRgn, rgn, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator&=(const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
SectRgn(mRgn, temp, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator^=(const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
XorRgn(mRgn, rgn, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
TRegion& TRegion::operator^=(const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
XorRgn(mRgn, temp, temp);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
return *this;
}
//---------------------------------------------------------------
//
// Arithmetic
//
//---------------------------------------------------------------
TRegion operator+(const TRegion& rgn1, const TRegion& rgn2)
{
TRegion newRgn;
UnionRgn(rgn1, rgn2, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator+(const TRegion& rgn, const TRect& rect)
{
TRegion newRgn(rect);
UnionRgn(rgn, newRgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator+(const TRect& rect, const TRegion& rgn)
{
TRegion newRgn(rect);
UnionRgn(newRgn, rgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator-(const TRegion& rgn1, const TRegion& rgn2)
{
TRegion newRgn;
DiffRgn(rgn1, rgn2, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator-(const TRegion& rgn, const TRect& rect)
{
TRegion newRgn(rect);
DiffRgn(rgn, newRgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator-(const TRect& rect, const TRegion& rgn)
{
TRegion newRgn(rect);
DiffRgn(newRgn, rgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator&(const TRegion& rgn1, const TRegion& rgn2)
{
TRegion newRgn;
SectRgn(rgn1, rgn2, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator&(const TRegion& rgn, const TRect& rect)
{
TRegion newRgn(rect);
SectRgn(rgn, newRgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator&(const TRect& rect, const TRegion& rgn)
{
TRegion newRgn(rect);
SectRgn(newRgn, rgn, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator^(const TRegion& rgn1, const TRegion& rgn2)
{
TRegion newRgn;
XorRgn(rgn1, rgn2, newRgn);
ThrowIfQDError();
return newRgn;
}
TRegion operator^(const TRegion& rgn, const TRect& rect)
{
TRegion newRgn(rect);
XorRgn(rgn, newRgn, newRgn);
return newRgn;
}
TRegion operator^(const TRect& rect, const TRegion& rgn)
{
TRegion newRgn(rect);
XorRgn(newRgn, rgn, newRgn);
ThrowIfQDError();
return newRgn;
}
void TRegion::MakeEmpty()
{
SetEmptyRgn(mRgn);
}
void TRegion::Map(const TRect& srcRect, const TRect& dstRect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
CopyRgn(mRgn, temp);
ThrowIfQDError();
::MapRgn(temp, srcRect, dstRect);
ThrowIfQDError();
ZRegionPool::Instance()->ReleaseRegion(mRgn);
mRgn = temp;
}
//---------------------------------------------------------------
//
// Comparison
//
//---------------------------------------------------------------
bool operator==(const TRegion& rgn1, const TRegion& rgn2)
{
return EqualRgn(rgn1, rgn2);
}
bool operator==(const TRegion& rgn, const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
bool equal = EqualRgn(rgn, temp);
ZRegionPool::Instance()->ReleaseRegion(temp);
return equal;
}
bool operator==(const TRect& rect, const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
bool equal = EqualRgn(rgn, temp);
ZRegionPool::Instance()->ReleaseRegion(temp);
return equal;
}
bool operator!=(const TRegion& rgn1, const TRegion& rgn2)
{
return !EqualRgn(rgn1, rgn2);
}
bool operator!=(const TRegion& rgn, const TRect& rect)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
bool equal = EqualRgn(rgn, temp);
ZRegionPool::Instance()->ReleaseRegion(temp);
return !equal;
}
bool operator!=(const TRect& rect, const TRegion& rgn)
{
RgnHandle temp = ZRegionPool::Instance()->AcquireRegion();
RectRgn(temp, rect);
ThrowIfQDError();
bool equal = EqualRgn(rgn, temp);
ZRegionPool::Instance()->ReleaseRegion(temp);
return !equal;
}
//---------------------------------------------------------------
//
// Moving
//
//---------------------------------------------------------------
TRegion operator+(const TRegion& rgn, const TPoint& offset)
{
TRegion result = rgn;
TRect src, dst;
src = dst = (**result).rgnBBox;
dst += offset;
::MapRgn(result, src, dst);
return result;
}
TRegion operator-(const TRegion& rgn, const TPoint& offset)
{
TRegion result = rgn;
TRect src, dst;
src = dst = (**result).rgnBBox;
dst -= offset;
::MapRgn(result, src, dst);
return result;
}
void TRegion::MoveTo(const TPoint& pt)
{
TPoint offset(pt - ((TRect) (**mRgn).rgnBBox)[topLeft]);
::OffsetRgn(mRgn, offset.h, offset.v);
}